package com.xcms.test;

import com.xcms.news.News;
import com.xcms.util.JDBCHelper;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author ：xx
 * @date ：Created in 2020/6/5 8:48
 * @description：
 * @modified By：
 */
public class ResultFs {
    public static void main(String[] args) {
        ResultSet rs= JDBCHelper.query("SELECT * FROM news ORDER BY id DESC LIMIT 0,10");
        List<News> newsList=getList(rs, "com.xcms.news.News");
        for (News news:newsList) {
            System.out.println(news);
        }

    }

    //T 就是一个任意类型
    public static <T> List<T> getList(ResultSet rs, String className) {
        List<T> tList=new ArrayList<>();
        try {
            //目的是：rs 和 News 的字段一一对应并赋值
            ResultSetMetaData metaData = rs.getMetaData();
            int columnCount = metaData.getColumnCount();
            Class<?> obj = Class.forName(className);
            while (rs!=null&&rs.next())
            {
                Field[] fields = obj.getDeclaredFields();
                //前提是该class必须有无参的构造函数
                Object o = obj.newInstance();
                for(int i=1;i<=columnCount;i++){
                    String cloumnName= metaData.getColumnName(i);
    //                    System.out.println(cloumnName);
                    //减少代码耦合
                    for (Field field:fields) {
                        //判断field 和 metaData的列是否对应
                        if(field.getName().equals(cloumnName))
                        {
                            //忽略访问权限
                            field.setAccessible(true);
                            field.set(o,rs.getObject(cloumnName));
                        }
                    }
                }
//                System.out.println(o);
                tList.add((T)o);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            JDBCHelper.close();
        }
        return tList;
    }

}
